#include <iostream>
#include <string>

using namespace std;

// Complex 类表示复数
class Complex
{
private:
    double real;  // 复数的实部
    double imag;  // 复数的虚部

public:
    // 默认构造函数，初始化实部和虚部为0
    Complex(/* args */) : real(0), imag(0)
    {
        // 这里不做其他操作，实部和虚部已经在初始化列表中设置为0
    }

    // 带参数的构造函数，初始化复数的实部和虚部
    Complex(double real, double imag) : real(real), imag(imag)
    {
        // 通过初始化列表设置实部和虚部
    }

    // 析构函数
    ~Complex()
    {
        // 这里没有特别需要清理的资源，默认析构即可
    }

public:
    // 显示复数的实部和虚部
    void show()
    {
        cout << "实部" << real << "虚部" << imag << endl;  // 打印复数的实部和虚部
    }

public:
    // 单目运算符 "!" 的重载，用于判断复数是否为零复数
    bool operator!() const
    {
        // 判断复数是否为零复数：实部和虚部都为0时为零复数
        bool b = !(this->imag + this->real);  // 如果实部和虚部之和为0，则返回 true
        return b;
    }

    // 重载输出流运算符 "<<"，使得复数可以直接通过 cout 输出
    friend ostream & operator<<(ostream & os, const Complex & O);
};

// 输出流运算符的实现，用于将复数的实部和虚部输出到标准输出流
ostream & operator<<(ostream & os, const Complex & O)
{
    os << "实部" << O.real << "虚部" << O.imag;  // 打印复数的实部和虚部
    return os;  // 返回输出流，以便可以连续输出
}

int main(int argc, char const *argv[])
{
    // 创建一个复数对象 F，实部为 10，虚部为 20
    Complex F(10, 20);

    // 使用重载的 "!" 运算符，判断复数是否为零复数
    bool b = !F;

    // 输出复数 F 的实部和虚部
    // F.show();  // 取消注释可以使用 show 函数显示复数（已注释）

    // 通过重载的输出流运算符直接输出复数 F
    cout << F << endl;  // 使用 cout 输出复数，调用了 operator<< 函数

    return 0;  // 程序结束
}
